/**
 * Koa应用主文件
 * 配置和启动服务器
 */
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const config = require('./config');
const corsMiddleware = require('./middleware/cors');
const { errorHandler, notFoundHandler } = require('./middleware/error');
const { loggerMiddleware, log } = require('./middleware/logger');
const router = require('./routes');

// 创建Koa应用实例
const app = new Koa();

/**
 * 配置中间件
 */
// 错误处理中间件（最先注册）
app.use(errorHandler());

// 日志中间件
app.use(loggerMiddleware());

// CORS中间件
app.use(corsMiddleware());

// 请求体解析中间件
app.use(bodyParser({
  jsonLimit: '10mb',
  textLimit: '10mb',
  formLimit: '10mb'
}));

// 路由中间件
app.use(router.routes());
app.use(router.allowedMethods());

// 404处理中间件（放在路由之后）
app.use(notFoundHandler());

/**
 * 启动服务器
 */
function startServer() {
  const port = config.server.port;
  const host = config.server.host;

  const server = app.listen(port, () => {
    log.info(`🚀 服务器启动成功`);
    log.info(`📍 地址: http://${host}:${port}`);
    log.info(`🌍 环境: ${config.server.env}`);
    log.info(`🤖 LLM模型: ${config.qwen.model}`);
    log.info(`🔧 MCP工具: ${config.mcp.enabled ? '已启用' : '已禁用'}`);
  });

  // 优雅关闭处理
  process.on('SIGTERM', () => {
    log.info('收到SIGTERM信号，正在关闭服务器...');
    server.close(() => {
      log.info('服务器已关闭');
      process.exit(0);
    });
  });

  process.on('SIGINT', () => {
    log.info('收到SIGINT信号，正在关闭服务器...');
    server.close(() => {
      log.info('服务器已关闭');
      process.exit(0);
    });
  });

  // 未捕获异常处理
  process.on('uncaughtException', (error) => {
    log.error('未捕获的异常', error);
    process.exit(1);
  });

  process.on('unhandledRejection', (reason, promise) => {
    log.error('未处理的Promise拒绝', { reason, promise });
    process.exit(1);
  });

  return server;
}

// 如果直接运行此文件，则启动服务器
if (require.main === module) {
  startServer();
}

module.exports = { app, startServer };